package core

import (
	"fmt"
	"os"
	"regexp"
	"strings"

	"github.com/satori/go.uuid"

	"htmlcopy/config"
)

// 获取地址的domain地址
func getDomain(root string) string {
	var domain string

	if strings.Count(root, "/") <= 2 { //如果只包含3个及以下的/则他本身就是domain
		domain = root
	} else {
		if strings.HasPrefix(root, "http://") {
			i := root[7:]
			j := i[:strings.Index(i, "/")]
			domain = "http://" + j
		}
		if strings.HasPrefix(root, "https://") {
			i := root[8:]
			j := i[:strings.Index(i, "/")]
			domain = "https://" + j
		}
	}

	return domain
}

// 获取sourceurl资源中解析出的url地址的真实资源地址
// 因为解析出的url地址肯能是sourceurl的相对地址
func realurl(url, soucreurl string) string {
	if url == "" {
		return url
	}
	// 如果地址是以http或者https开头 则本身就是实际下载地址
	if strings.HasPrefix(url, "http://") || strings.HasPrefix(url, "https://") {
		return url
	}
	// 如果以//开头 则添加http:在前端
	if strings.HasPrefix(url, "//") {
		return "http:" + url
	}
	// 如果以/开头 则在前面添加domain
	if strings.HasPrefix(url, "/") {
		return getDomain(soucreurl) + url
	}
	// 如果以./开头 则在前面添加domain
	if strings.HasPrefix(url, "./") {
		return getDomain(soucreurl) + url[1:]
	}
	// 如果以../开头 则需要计算目录的上一级目录
	if strings.HasPrefix(url, "../") {
		// 计算路径中包含的../个数
		count := strings.Count(url, "../")

		return noMethod(soucreurl, "/", count+1) + url[3*count:]
	}

	// 如果以上都不匹配则表示同级目录
	// 如果源地址为2"/"的地址, 则表示该地址就为顶层地址
	if strings.Count(soucreurl, "/") == 2 {
		return soucreurl + "/" + url
	}

	return noMethod(soucreurl, "/", 1) + url
}

// "http://c.csdnimg.cn/comm_ask/css/ask_float_block.css", "/", 2
// return "http://c.csdnimg.cn/comm_ask"
func noMethod(s string, sep string, num int) string {
	for i := 0; i < num; i++ {
		s = s[0:strings.LastIndex(s, sep)]
	}
	return s + sep
}

// 将by写入到path对应的文件中
func saveByteToFile(by []byte, path string) error {

	file, err := os.Create(path)
	if err != nil {
		return err
	}
	defer file.Close()

	_, err = file.Write(by)
	return err
}

// 根据contentType和资源地址获取资源的后缀名称
// 如未解析出后缀则返回.other
func getsuffix(contentType, url string) string {
	// 从配置文件中匹配后缀名
	suffix := config.GetSuffix(contentType)
	if suffix != "" {
		return suffix
	}
	// 如果配置文件中没有匹配到，则通过url进行匹配地址
	// 如果有参数则将参数去除
	if strings.Contains(url, "?") {
		url = url[:strings.Index(url, "?")]
	}
	// 如果有#号则将#号以后的去除
	if strings.Contains(url, "#") {
		url = url[:strings.Index(url, "#")]
	}
	suffix = url[strings.LastIndex(url, "."):]

	return suffix
}

// 生成一个随机的文件key
// suffix: 文件后缀名称
func upkey(suffix string) string {
	id := uuid.NewV4().String()
	key := strings.Replace(id, "-", "", -1)
	return key + suffix
}

// 解析data中所有的style资源地址
// 如符合url("xxxxxx"), url ('xxxxxx'), url(xxxxxx)
// 返回所有符合要求的资源地址
func styleusingurl(data []byte) []string {
	rt := make([]string, 0, 20)

	reg := regexp.MustCompile(`url\S?\(.*?\)`)
	ck := reg.FindAll(data, -1)
	if len(ck) == 0 {
		return rt
	}

	// 循环全部匹配的字符串，并使用map进行去重复
	m := make(map[string]int)
	for _, v := range ck {
		temp := string(v)
		// 解析出temp中有用的url字符串
		if strings.Contains(temp, "\"") {
			temp = temp[strings.Index(temp, "\"")+1 : strings.LastIndex(temp, "\"")]
		} else if strings.Contains(temp, "'") {
			temp = temp[strings.Index(temp, "'")+1 : strings.LastIndex(temp, "'")]
		} else {
			temp = temp[strings.Index(temp, "(")+1 : strings.Index(temp, ")")]
		}
		temp = strings.Trim(temp, " ")
		m[temp] = 1
	}

	for k, _ := range m {
		fmt.Println("style ---> " + k)
		rt = append(rt, k)
	}
	return rt
}
